package net.sansi.v3correctserver.task;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Created by Fang
 * create time : 2025/2/10
 * IDE : IntelliJ IDEA
 * <p>
 * 任务管理器
 */

public class V3TaskManager {

    // 任务池
    private final Map<String, V3Task<?, ?>> taskMap = new ConcurrentHashMap<>();

    /**
     * 添加任务
     *
     * @param task           任务
     * @param runImmediately 是否立即执行
     */
    public void addTask(V3Task<?, ?> task, boolean runImmediately) {
        taskMap.putIfAbsent(task.getTaskId(), task);
        if (task.isRunning()) return;
        if (runImmediately) task.start();
    }


    /**
     * 获取任务
     *
     * @param taskId 任务id
     * @return 任务
     */
    public V3Task<?, ?> get(String taskId) {
        return taskMap.get(taskId);
    }

    /**
     * 获取任务列表
     *
     * @return 任务列表
     */
    public List<V3Task<?, ?>> list() {
        return List.copyOf(taskMap.values());
    }

    /**
     * 移除任务
     *
     * @param taskId 任务id
     * @param wait   是否等待任务退出
     */
    public void removeTask(String taskId, boolean wait) {
        if (!taskMap.containsKey(taskId)) return;
        V3Task<?, ?> task = taskMap.get(taskId);
        if (wait) task.interruptWaitStop();
        else task.interrupt();
        taskMap.remove(taskId);
    }

    /**
     * 停止任务
     *
     * @param taskId 任务id
     * @param wait   是否等待任务退出
     */
    public void stopTask(String taskId, boolean wait) {
        if (!taskMap.containsKey(taskId)) return;
        V3Task<?, ?> task = taskMap.get(taskId);
        if (wait) task.interruptWaitStop();
        else task.interrupt();
    }

    /**
     * 清空任务
     *
     * @param wait 是否等待任务退出
     */
    public void clear(boolean wait) {
        for (V3Task<?, ?> task : taskMap.values()) {
            if (wait) task.interruptWaitStop();
            else task.interrupt();
        }
    }
}
